package com.itbaizhan.test.abstractClass;


/**
 * 接口 interface
 * 接口就是比“抽象”还“抽象”的“抽象类”，可以更加规范的对子类进行约束。
 全面地实现专业地实现了： 规范和具体实现的分离
 *[访问修饰符] interface 接口名  [extends 父接口1，父接口2..。] {
 常量定义;
 方法定义;
 }
 */
//访问修饰符:只能是public或默认
//接口名：和类名采用相同命名机制
//extends:接口可以多继承
//常量：接口中的属性只能是常量，总是：public static final 修饰，不写也是
//方法：接口中的方法只能是：public abstract(抽象）.省略的话，也是public abstract


// 要点
//子类通过implements来实现接口中的规范
//接口不能创建实例，但是可用于声明引用变量类型
//一个类实现接口，必须实现接口中所有的方法，并且这些方法只能是public的
//JDK1.8(不含8)之前，接口中只能包含静态常量、抽象方法，不能有普通属性、构造方法、普通方法
//JDK1.8（含8）后，接口中包含普通的静态方法、默认方法

/*接口是两个模块之间通信的标准，通信的规范。如果能把你要设计的模块之间的接口定义
   好，就相当于完成了系统的设计大纲，剩下的就是添砖加瓦的具体实现。大家在工作以后，
   做系统时往往就是用“面向接口”的思想来设计系统*/
/* 接口和实现类不是父子关系，是实现规则的关系。比如：我定义一个接口Runnable
，Car实现它就能在地上跑，Train实现它也能在地上跑，Plane实现它也能在地上跑，
 就是说，如果它是交通工具，就一定能跑，但是一定要实现Runnable 接口*/


//飞行接口
public interface Volant {
   /* public static final  隐藏*/ int Fly_HIGHT = 100; //常量
    /*public abstract*/ void fly();  // 方法
   // public void aa();
}
//新建一个接口
interface Honest {
    void helpOther();
}

//类与接口是实现的关系
//报错要重写方法，用来实现接口
class GoodMan implements Honest{

    @Override
    public void helpOther() {
        System.out.println("让座位给老人");
    }
}
class BirdMan implements Volant {

    @Override
    public void fly() {
        System.out.println("飞上天");
    }

   /* @Override
    public void aa() {
        System.out.println(2222);
    }*/
}
//一个类实现多个接口
//实现
//接口是用来实现，继承才会存在向上转型以及向下转型
class Angel implements Volant{
    @Override
    public void fly() {
        System.out.println("Angel.fly");
    }

  /*  @Override
    public void aa() {
        System.out.println(111);
    }*/

  /*  @Override
    public void helpOther() {
        System.out.println("Angel.helpOther");
    }*/
}
//抽象他们的共同体  都会飞

class Plane implements Volant {

    @Override
    public void fly() {
        System.out.println("Plane.fly");
    }
}

